Load code

Variables

Load data

Filter data

success

Single lemma

Load data

Check tweets

tweets %>%
  select(tweet, date) %>%
  # slice(., sample(1:n())) #random selection
  arrange(date)

Check uses and edges

df_comp %>%
  filter(LEMMA == 'hyperlocal') %>%
  select(LEMMA, USES_TOT, SUBSET, USES)

Case studies

Data overview

Usage frequency

Overall across cases

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
   arrange(desc(USES_TOT))

Uses in first subset

df_comp %>%
  filter(
    SUBSETTING == 'time',
    SUBSET == 'one'
    ) %>%
  select(LEMMA, USES_TOT, USES) %>%
  arrange(USES)

Degree centralization

Diachronic

cent_diac_incr <- c('robo-signing', 'circular economy', 'alt-right', 'Brexiteer')
cent_diac_const <- c('upskill')
cent_diac_decr <- c('blockchain', 'newsjacking', 'overtourism')


df_comp %>%
  select(LEMMA, SUBSETTING, SUBSET, CENT_DEGREE, CENT_EV, DENSITY) %>%
  filter(
    SUBSET != 'full',
    LEMMA %in% c(cases)
    # LEMMA %in% c(cases, 'hyperlocal', 'blockchain', 'climate denial', 'man bun', 'upskill', 'deep learning')
    # overtourism: diff too big for case study scale; 
    # , 'broflake', 'climate crisis', 'incel', 'overtourism'
  ) %>%
  ggplot(., aes(x=SUBSET, y=CENT_DEGREE)) + # group=1
    geom_point(aes(group=LEMMA, color=LEMMA, shape=LEMMA)) +
    geom_line(aes(group=LEMMA, color=LEMMA, linetype=LEMMA)) +
    guides(group=TRUE) +
    ggtitle('Diffusion over time: changes in degree centralization') +
    scale_y_continuous('degree centrality') +
    scale_x_discrete('subset')

# ggplotly(plt)
ggsave('out/cases_cent_diac.pdf', width=6, height=4)

Overall

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
  select(
    LEMMA, 
    EDGES,
    CENT_DEGREE, 
    CENT_EV
    ) %>%
  arrange((CENT_DEGREE))

Full sample

Usage intensity

df_comp %>%
  filter(SUBSET == 'full') %>%
  arrange(desc(USES_TOT))

Edges

Degree centrality

Overall

List

df_comp %>%
  select(LEMMA, SUBSET, USES_TOT, CENT_DEGREE, CENT_EV) %>%
  filter(
    SUBSET == 'full'
    # USES >= 2
    ) %>%
  arrange(
    (CENT_DEGREE)
    # desc(CENT_EV)
  )

Plot

plt <- df_comp %>%
  select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
  filter(SUBSET == 'full') %>%
  arrange((CENT_DEGREE)) %>%
  ggplot(., aes(x=CENT_DEGREE, y=reorder(LEMMA, CENT_DEGREE))) +
    geom_point() +
    scale_y_discrete('lemmas') +
    scale_x_continuous(
      'degree centralization (log)',
      trans='log'
      )

plt


# ggsave('out/cent_sync_all.pdf', width=6, height=4)

Over time

Across all lemmas

df_comp %>%
  filter(
    SUBSET %in% c('one', 'two', 'three', 'four'),
    LEMMA %in% unsuccessful_diffs
    # USES_TOT >= 10000
    # USES > 1000
    ) %>%
  group_by(SUBSET) %>%
  summarize(
    DENS_AVG = mean(DENSITY),
    CENT_AVG = mean(CENT_DEGREE)
    ) %>%
  ggplot(., aes(x=SUBSET, y=DENS_AVG, group=1)) +
    geom_line() +
    geom_point() +
    scale_y_continuous('degree centralization') +
    scale_x_discrete('subsets')


# ggsave('out/full_cent_diac.pdf', width=6, height=4)

Biggest changes

df_comp %>%
  select(LEMMA, SUBSET, CENT_DEGREE, EDGES, USES_TOT) %>%
  filter(
    SUBSET %in% c(
      'one', 
      'four'
      ),
    USES_TOT >= 10000
    ) %>%
  dplyr::group_by(LEMMA) %>%
  dplyr::mutate(CENT_DIFF = CENT_DEGREE - lag(CENT_DEGREE, default=CENT_DEGREE[1])) %>%
  drop_na() %>%
  select(-SUBSET) %>%
  rename(
    CENT_LAST = CENT_DEGREE,
    EDGES_LAST = EDGES
    ) %>%
  arrange((CENT_DIFF))

Density

overall

df_comp %>%
  select(LEMMA, SUBSET, USES_TOT, CENT_DEGREE, DENSITY) %>%
  filter(SUBSET == 'four') %>%
  arrange(DENSITY)

over time

case studies

ggplotly(plt)
The shape palette can deal with a maximum of 6 discrete values because more than 6 becomes difficult to
discriminate; you have 8. Consider specifying shapes manually if you must have them.

full sample

df_comp %>%
  filter(
    SUBSET %in% c('one', 'two', 'three', 'four'),
    LEMMA %in% unsuccessful_diffs,
    USES_TOT >= 10000
    ) %>%
  group_by(SUBSET) %>%
  summarize(
    DENS_AVG = mean(DENSITY)
    ) %>%
  ggplot(., aes(x=SUBSET, y=DENS_AVG, group=1)) +
    geom_line() +
    geom_point() +
    scale_y_continuous('density') +
    scale_x_discrete('subsets')

biggest changes

df_comp %>%
  select(LEMMA, SUBSET, CENT_DEGREE, DENSITY, EDGES, USES_TOT) %>%
  filter(
    SUBSET %in% c(
      'one', 
      'four'
      )
    # USES_TOT >= 10000
    ) %>%
  dplyr::group_by(LEMMA) %>%
  dplyr::mutate(DENS_DIFF = DENSITY - lag(DENSITY, default=DENSITY[1])) %>%
  drop_na() %>%
  select(-SUBSET) %>%
  rename(
    DENS_LAST = DENSITY,
    EDGES_LAST = EDGES
    ) %>%
  arrange((DENS_DIFF))

Frequency vs. networks

Frequency vs. centralization

Plot

Full sample

df_comp %>%
  filter(
    SUBSET == 'four',
    # USES_TOT %in% (150000:500000)
    # LEMMA %in% c(cases)
    # !LEMMA %in% c('slut shaming', 'dashcam', 'shareable', 'cuckold', 'deep learning', 'hyperlocal')
    ) %>%
  select(LEMMA, CENT_DEGREE, USES_TOT, USES, EDGES) %>%
  ggplot(., aes(x=CENT_DEGREE, y=USES_TOT)) +
    geom_text(aes(label=LEMMA), hjust=-0.1, vjust=-0.1) + 
    # geom_point() +
    scale_y_continuous(
      'usage frequency (log)', 
      trans='log'
      ) +
    scale_x_continuous(
      'degree centralization',
      trans='log'
      )

# ggplotly(plt)
ggsave('out/full_cent_freq_overall.pdf', width=6, height=4)

Case studies

df_cases <- df_comp %>%
  filter(
    SUBSET == 'full',
    LEMMA %in% c(cases),
    !LEMMA %in% c('poppygate', 'upskill')
    )

cases_freq_min <- df_cases %>%
  select(USES_TOT) %>%
  arrange(USES_TOT) %>%
  slice(1:1) %>%
  pull(USES_TOT)
  

cases_freq_max <- df_cases %>%
  select(USES_TOT) %>%
  arrange(desc(USES_TOT)) %>%
  slice(1:1) %>%
  pull(USES_TOT)

df_comp %>%
  filter(
    SUBSET == 'full',
    USES_TOT >= cases_freq_min,
    USES_TOT <= cases_freq_max,
    !LEMMA %in% c('big dick energy', 'slut shaming', 'cuckold', 'shareable', 'Brexiteer', 'incel', 'dashcam')
    ) %>%
  select(LEMMA, CENT_DEGREE, USES_TOT, USES, EDGES) %>%
  ggplot(., aes(x=CENT_DEGREE, y=USES_TOT)) +
    geom_text(aes(label=LEMMA), color='black', hjust=-0.1, vjust=-0.1) + 
    geom_point() + 
    geom_text(data=df_cases, aes(label=LEMMA), color='blue', hjust=-0.1, vjust=-0.1) +
    # geom_point() +
    scale_y_continuous(
      'usage frequency (log)', 
      trans='log'
      ) +
    scale_x_continuous(
      'degree centralization'
      # trans='log'
      )


# ggsave('out/cases_cent_freq_overall.pdf', width=6, height=4)

Biggest discrepancies

df_comp %>%
  filter(
    SUBSETTING == 'time',
    SUBSET == 'four'
    ) %>%
  select(LEMMA, USES_TOT, CENT_DEGREE) %>%
  mutate(DISC = USES_TOT / CENT_DEGREE) %>%
  arrange(DISC)

Correlation

df_corr <- df_comp %>%
  filter(
    # SUBSET != 'full'
    # EDGES >= 100
    ) %>%
  select(-c(LEMMA, SUBSET, START, END, SKIP, STAMP))
  
cor.test(df_corr$USES, df_corr$CENT_DEGREE)

    Pearson's product-moment correlation

data:  df_corr$USES and df_corr$CENT_DEGREE
t = -2.3698, df = 509, p-value = 0.01817
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.1894877 -0.0178851
sample estimates:
       cor 
-0.1044639 

Coefficient of variation

df_comp %>%
  filter(
    SUBSET == 'full',
    USES_TOT >= 1000
    ) %>%
  select(LEMMA, USES_TOT, COEF_VAR) %>%
  arrange(desc(COEF_VAR))

Processing status

Lemma list

df_comp %>%
  select(LEMMA, SUBSET, STAMP) %>%
  filter(SUBSET == 'four') %>%
  # mutate(STAMP = as_datetime(STAMP)) %>%
  arrange(desc(STAMP))

Dataset statistics

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, SUBSET, USES_TOT, USERS_TOT) %>%
  dplyr::summarise(
    USES_ALL = sum(USES_TOT),
    USERS_ALL = sum(USERS_TOT)
    )
LS0tCmF1dGhvcjogJ1F1aXJpbiBXw7xyc2NoaW5nZXInCnRpdGxlOiAiU29jaWFsIG5ldHdvcmtzIG9mIGxleGljYWwgaW5ub3ZhdGlvbiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCi0tLQoKIyBMb2FkIGNvZGUKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnNvdXJjZSgnc3JjL2xvYWQtZGF0YS5SJykKc291cmNlKCdzcmMvcG9zdHByb2MuUicpCnNvdXJjZSgnc3JjL3VzZXMuUicpCnNvdXJjZSgnc3JjL3VzZXJzLlInKQpzb3VyY2UoJ3NyYy9zbmEuUicpCgpsaWJyYXJ5KGNvcnJyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KG1hZ3JpdHRyKQpgYGAKCgojIFZhcmlhYmxlcwoKYGBge3IgaW5jbHVkZT1GQUxTRX0Kc3Vic2V0dGluZyA9ICd0aW1lJwpkaWZmX3N0YXJ0X21ldGhvZCA8LSAnZWRnZXMnCmRpZmZfc3RhcnRfbGltaXQgPC0gMwoKY2FzZXMgPC0gYygKICAjICd1cGN5Y2xpbmcnLAogICMgJ2dob3N0aW5nJywKICAjICdsaXR1YXRpb24nCiAgIyAnY2lyY3VsYXIgZWNvbm9teScsCiAgJ3Vwc2tpbGwnLAogICdoeXBlcmxvY2FsJywKICAnc29sb3ByZW5ldXInLAogICdhbHQtbGVmdCcsCiAgJ2FsdC1yaWdodCcsCiAgJ3BvcHB5Z2F0ZScKICApCgpgYGAKCgojIExvYWQgZGF0YQoKYGBge3IgaW5jbHVkZT1GQUxTRX0KaWYgKGV4aXN0cygnZGZfY29tcCcpID09IEZBTFNFKSB7CiAgZGZfY29tcCA8LSByZWFkX2RmX2NvbXAoZl9wYXRoPSdvdXQvZGZfY29tcC5jc3YnKQp9CmBgYAoKCiMgRmlsdGVyIGRhdGEKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmRmX2NvbXAgJTw+JSAKICBmaWx0ZXIoCiAgICBTS0lQICE9IFRSVUUsCiAgICBTVUJTRVRUSU5HID09IHN1YnNldHRpbmcsCiAgICAjIGVzdGFibGlzaGVkIHdvcmRzCiAgICAhTEVNTUEgJWluJSBjKCdBbmdsby1TYXhvbicsICdjbGltYXRlIGNyaXNpcycsICdnbG9iYWwgaGVhdGluZycsICdncmVlbndhc2hpbmcnLCAncG9saXRpY2FsIGNvcnJlY3RuZXNzJywgJ3JlZnVnZWUgY3Jpc2lzICcpLAogICAgIyBzdWNjZXNzZnVsIHdvcmRzOiBVU0VTX1RPVCA+PSAxMDAwMAogICAgIyB1bnN1Y2Nlc3NmdWwgd29yZHM6IFVTRVNfVE9UIDw9IDEwMDAwCiAgICAjIHdlaXJkIHdvcmRzOiBiaWcgZGljayBlbmVyZ3kKICAgICFMRU1NQSAlaW4lIGMoJ2Nvb2twcm9jZXNzb3InKQogICkKYGBgCgoKIyMgc3VjY2VzcwoKYGBge3J9CmRmX3N1Y2Nlc3MgPC0gZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFUywgQ0VOVF9ERUdSRUUpICU+JQogIGZpbHRlcihTVUJTRVQgIT0gJ2Z1bGwnKSAlPiUKICBncm91cF9ieShMRU1NQSkgJT4lCiAgbXV0YXRlKERJRkZfVVNFUyA9IFVTRVMgLSBsYWcoVVNFUykpICU+JQogIG11dGF0ZShESUZGX1VTRVNfVE9UID0gc3VtKERJRkZfVVNFUywgbmEucm09VFJVRSkpICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2ZvdXInKSAlPiUKICBhcnJhbmdlKERJRkZfVVNFU19UT1QpCgpzdWNjZXNzZnVsX2RpZmZzIDwtIGRmX3N1Y2Nlc3MgJT4lCiAgZmlsdGVyKERJRkZfVVNFU19UT1QgPiAwKSAlPiUKICBwdWxsKExFTU1BKQoKdW5zdWNjZXNzZnVsX2RpZmZzIDwtIGRmX3N1Y2Nlc3MgJT4lCiAgZmlsdGVyKERJRkZfVVNFU19UT1QgPCAwKSAlPiUKICBwdWxsKExFTU1BKQoKc3VjY2Vzc2Z1bF91c2VzX21pbiA8LSBkZl9jb21wICU+JQogIGZpbHRlcihVU0VTID4gMTAwMCkgJT4lCiAgcHVsbChMRU1NQSkKICAKICAKdW5zdWNjZXNzZnVsX3VzZXNfbWluIDwtIGRmX2NvbXAgJT4lCiAgZmlsdGVyKFVTRVMgPCAxMDAwKSAlPiUKICBwdWxsKExFTU1BKQpgYGAKCgojIFNpbmdsZSBsZW1tYQoKIyMgTG9hZCBkYXRhCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpjb3JwdXMgPC0gJy9Wb2x1bWVzL3FqZC90d2ludC8nCmxlbW1hIDwtICdhbHQtbGVmdCcKCnR3ZWV0cyA8LSBsb2FkX2RhdGEoY29ycHVzLCBsZW1tYSkKdHdlZXRzIDwtIHBvc3Rwcm9jKHR3ZWV0cykKdHdlZXRzIDwtIGZpbHRlcl90d2VldHModHdlZXRzKQpgYGAKCgojIyBDaGVjayB0d2VldHMKCmBgYHtyfQp0d2VldHMgJT4lCiAgc2VsZWN0KHR3ZWV0LCBkYXRlKSAlPiUKICAjIHNsaWNlKC4sIHNhbXBsZSgxOm4oKSkpICNyYW5kb20gc2VsZWN0aW9uCiAgYXJyYW5nZShkYXRlKSAlPiUKICBWaWV3KCkKYGBgCgoKIyMgQ2hlY2sgdXNlcyBhbmQgZWRnZXMKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihMRU1NQSA9PSAnaHlwZXJsb2NhbCcpICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIFNVQlNFVCwgVVNFUykKYGBgCgoKIyBDYXNlIHN0dWRpZXMKCiMjIERhdGEgb3ZlcnZpZXcKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgTEVNTUEgJWluJSBjYXNlcywKICAgIFNVQlNFVCA9PSAnZnVsbCcKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTPVVTRVNfVE9ULCBTUEVBS0VSUz1VU0VSU19UT1QpICU+JQogIG11dGF0ZShVU0VTX1BFUl9TUEVBS0VSID0gVVNFUyAvIFNQRUFLRVJTKSAlPiUKICBhcnJhbmdlKGRlc2MoVVNFUykpCiAgIyBnZ3Bsb3QoZGF0YT0uLCBhZXMoeD1VU0VSU19UT1QsIHk9VVNFU19UT1QpKSArCiAgIyAgIGdlb21fdGV4dChhZXMobGFiZWw9TEVNTUEpKSArCiAgIyAgIHNjYWxlX3lfY29udGludW91cygnZnJlcXVlbmN5IChsb2cpJywgdHJhbnM9J2xvZycpCmBgYAoKCiMjIFVzYWdlIGZyZXF1ZW5jeQoKIyMjIE92ZXJhbGwgYWNyb3NzIGNhc2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBMRU1NQSAlaW4lIGNhc2VzLAogICAgU1VCU0VUID09ICdmdWxsJwogICAgKSAlPiUKICAgYXJyYW5nZShkZXNjKFVTRVNfVE9UKSkKYGBgCgoKIyMjIFVzZXMgaW4gZmlyc3Qgc3Vic2V0CgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVRUSU5HID09ICd0aW1lJywKICAgIFNVQlNFVCA9PSAnb25lJwogICAgKSAlPiUKICBzZWxlY3QoTEVNTUEsIFVTRVNfVE9ULCBVU0VTKSAlPiUKICBhcnJhbmdlKFVTRVMpCmBgYAoKCgojIyBEZWdyZWUgY2VudHJhbGl6YXRpb24KCiMjIyBEaWFjaHJvbmljCgpgYGB7cn0KY2VudF9kaWFjX2luY3IgPC0gYygncm9iby1zaWduaW5nJywgJ2NpcmN1bGFyIGVjb25vbXknLCAnYWx0LXJpZ2h0JywgJ0JyZXhpdGVlcicpCmNlbnRfZGlhY19jb25zdCA8LSBjKCd1cHNraWxsJykKY2VudF9kaWFjX2RlY3IgPC0gYygnYmxvY2tjaGFpbicsICduZXdzamFja2luZycsICdvdmVydG91cmlzbScpCgoKZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVFRJTkcsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIENFTlRfRVYsIERFTlNJVFkpICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAhPSAnZnVsbCcsCiAgICBMRU1NQSAlaW4lIGMoY2FzZXMpCiAgICAjIExFTU1BICVpbiUgYyhjYXNlcywgJ2h5cGVybG9jYWwnLCAnYmxvY2tjaGFpbicsICdjbGltYXRlIGRlbmlhbCcsICdtYW4gYnVuJywgJ3Vwc2tpbGwnLCAnZGVlcCBsZWFybmluZycpCiAgICAjIG92ZXJ0b3VyaXNtOiBkaWZmIHRvbyBiaWcgZm9yIGNhc2Ugc3R1ZHkgc2NhbGU7IAogICAgIyAsICdicm9mbGFrZScsICdjbGltYXRlIGNyaXNpcycsICdpbmNlbCcsICdvdmVydG91cmlzbScKICApICU+JQogIGdncGxvdCguLCBhZXMoeD1TVUJTRVQsIHk9Q0VOVF9ERUdSRUUpKSArICMgZ3JvdXA9MQogICAgZ2VvbV9wb2ludChhZXMoZ3JvdXA9TEVNTUEsIGNvbG9yPUxFTU1BLCBzaGFwZT1MRU1NQSkpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXA9TEVNTUEsIGNvbG9yPUxFTU1BLCBsaW5ldHlwZT1MRU1NQSkpICsKICAgIGd1aWRlcyhncm91cD1UUlVFKSArCiAgICBnZ3RpdGxlKCdEaWZmdXNpb24gb3ZlciB0aW1lOiBjaGFuZ2VzIGluIGRlZ3JlZSBjZW50cmFsaXphdGlvbicpICsKICAgIHNjYWxlX3lfY29udGludW91cygnZGVncmVlIGNlbnRyYWxpdHknKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKCdzdWJzZXQnKQoKIyBnZ3Bsb3RseShwbHQpCiMgZ2dzYXZlKCdvdXQvY2FzZXNfY2VudF9kaWFjLnBkZicsIHdpZHRoPTYsIGhlaWdodD00KQpgYGAKCgojIyMgT3ZlcmFsbAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgTEVNTUEgJWluJSBjYXNlcywKICAgIFNVQlNFVCA9PSAnZnVsbCcKICAgICkgJT4lCiAgc2VsZWN0KAogICAgTEVNTUEsIAogICAgRURHRVMsCiAgICBDRU5UX0RFR1JFRSwgCiAgICBDRU5UX0VWCiAgICApICU+JQogIGFycmFuZ2UoKENFTlRfREVHUkVFKSkKYGBgCgoKIyBGdWxsIHNhbXBsZQoKIyBVc2FnZSBpbnRlbnNpdHkKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBhcnJhbmdlKGRlc2MoVVNFU19UT1QpKQpgYGAKCgojIEVkZ2VzCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpkZl9jb21wICU+JQogIGRwbHlyOjpncm91cF9ieShMRU1NQSkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnb25lJykgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVMsIEVER0VTKSAlPiUKICBhcnJhbmdlKEVER0VTKQpgYGAKCgojIERlZ3JlZSBjZW50cmFsaXR5CgojIyBPdmVyYWxsCgojIyMgTGlzdAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVNfVE9ULCBDRU5UX0RFR1JFRSwgQ0VOVF9FVikgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmdWxsJwogICAgIyBVU0VTID49IDIKICAgICkgJT4lCiAgYXJyYW5nZSgKICAgIChDRU5UX0RFR1JFRSkKICAgICMgZGVzYyhDRU5UX0VWKQogICkKYGBgCgoKIyMjIFBsb3QKCmBgYHtyfQpwbHQgPC0gZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFUywgQ0VOVF9ERUdSRUUpICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBhcnJhbmdlKChDRU5UX0RFR1JFRSkpICU+JQogIGdncGxvdCguLCBhZXMoeD1DRU5UX0RFR1JFRSwgeT1yZW9yZGVyKExFTU1BLCBDRU5UX0RFR1JFRSkpKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9kaXNjcmV0ZSgnbGVtbWFzJykgKwogICAgc2NhbGVfeF9jb250aW51b3VzKAogICAgICAnZGVncmVlIGNlbnRyYWxpemF0aW9uIChsb2cpJywKICAgICAgdHJhbnM9J2xvZycKICAgICAgKQoKcGx0CgojIGdnc2F2ZSgnb3V0L2NlbnRfc3luY19hbGwucGRmJywgd2lkdGg9NiwgaGVpZ2h0PTQpCmBgYAoKCiMjIyBPdmVyIHRpbWUKCiMjIyMgQWNyb3NzIGFsbCBsZW1tYXMKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAlaW4lIGMoJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicpLAogICAgTEVNTUEgJWluJSB1bnN1Y2Nlc3NmdWxfZGlmZnMKICAgICMgVVNFU19UT1QgPj0gMTAwMDAKICAgICMgVVNFUyA+IDEwMDAKICAgICkgJT4lCiAgZ3JvdXBfYnkoU1VCU0VUKSAlPiUKICBzdW1tYXJpemUoCiAgICBERU5TX0FWRyA9IG1lYW4oREVOU0lUWSksCiAgICBDRU5UX0FWRyA9IG1lYW4oQ0VOVF9ERUdSRUUpCiAgICApICU+JQogIGdncGxvdCguLCBhZXMoeD1TVUJTRVQsIHk9REVOU19BVkcsIGdyb3VwPTEpKSArCiAgICBnZW9tX2xpbmUoKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKCdkZWdyZWUgY2VudHJhbGl6YXRpb24nKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKCdzdWJzZXRzJykKCiMgZ2dzYXZlKCdvdXQvZnVsbF9jZW50X2RpYWMucGRmJywgd2lkdGg9NiwgaGVpZ2h0PTQpCmBgYAoKCiMjIyMgQmlnZ2VzdCBjaGFuZ2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIEVER0VTLCBVU0VTX1RPVCkgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICVpbiUgYygKICAgICAgJ29uZScsIAogICAgICAnZm91cicKICAgICAgKSwKICAgIFVTRVNfVE9UID49IDEwMDAwCiAgICApICU+JQogIGRwbHlyOjpncm91cF9ieShMRU1NQSkgJT4lCiAgZHBseXI6Om11dGF0ZShDRU5UX0RJRkYgPSBDRU5UX0RFR1JFRSAtIGxhZyhDRU5UX0RFR1JFRSwgZGVmYXVsdD1DRU5UX0RFR1JFRVsxXSkpICU+JQogIGRyb3BfbmEoKSAlPiUKICBzZWxlY3QoLVNVQlNFVCkgJT4lCiAgcmVuYW1lKAogICAgQ0VOVF9MQVNUID0gQ0VOVF9ERUdSRUUsCiAgICBFREdFU19MQVNUID0gRURHRVMKICAgICkgJT4lCiAgYXJyYW5nZSgoQ0VOVF9ESUZGKSkKYGBgCgoKIyBEZW5zaXR5CgojIyBvdmVyYWxsCgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFU19UT1QsIENFTlRfREVHUkVFLCBERU5TSVRZKSAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmb3VyJykgJT4lCiAgYXJyYW5nZShERU5TSVRZKQpgYGAKCgojIyBvdmVyIHRpbWUKCiMjIyBjYXNlIHN0dWRpZXMKCmBgYHtyfQpkZW5zX2luY3IgPC0gYygncm9iby1zaWduaW5nJykKZGVuc19kZWNyIDwtIGMoJ2RlZXAgbGVhcm5pbmcnLCAnYXJ0aWZpY2lhbCBpbnRlbGxpZ2VuY2UnKQoKcGx0IDwtIGRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVRUSU5HLCBTVUJTRVQsIENFTlRfREVHUkVFLCBERU5TSVRZKSAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgIT0gJ2Z1bGwnLAogICAgTEVNTUEgJWluJSBjKGNhc2VzLCBkZW5zX2RlY3IpCiAgKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9U1VCU0VULCB5PURFTlNJVFkpKSArICMgZ3JvdXA9MQogICAgZ2VvbV9wb2ludChhZXMoZ3JvdXA9TEVNTUEsIGNvbG9yPUxFTU1BLCBzaGFwZT1MRU1NQSkpICsKICAgIGdlb21fbGluZShhZXMoZ3JvdXA9TEVNTUEsIGNvbG9yPUxFTU1BLCBsaW5ldHlwZT1MRU1NQSkpICsKICAgIGd1aWRlcyhncm91cD1UUlVFKSArCiAgICBnZ3RpdGxlKCdEaWZmdXNpb24gb3ZlciB0aW1lOiBjaGFuZ2VzIGluIGRlZ3JlZSBjZW50cmFsaXphdGlvbicpICsKICAgIHNjYWxlX3lfY29udGludW91cygnZGVuc2l0eScpICsKICAgIHNjYWxlX3hfZGlzY3JldGUoJ3N1YnNldCcpCgpnZ3Bsb3RseShwbHQpCiMgZ2dzYXZlKCdvdXQvY2FzZXNfY2VudF9kaWFjLnBkZicsIHdpZHRoPTYsIGhlaWdodD00KQpgYGAKCgojIyMgZnVsbCBzYW1wbGUKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCAlaW4lIGMoJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicpLAogICAgTEVNTUEgJWluJSB1bnN1Y2Nlc3NmdWxfZGlmZnMsCiAgICBVU0VTX1RPVCA+PSAxMDAwMAogICAgKSAlPiUKICBncm91cF9ieShTVUJTRVQpICU+JQogIHN1bW1hcml6ZSgKICAgIERFTlNfQVZHID0gbWVhbihERU5TSVRZKQogICAgKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9U1VCU0VULCB5PURFTlNfQVZHLCBncm91cD0xKSkgKwogICAgZ2VvbV9saW5lKCkgKwogICAgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfY29udGludW91cygnZGVuc2l0eScpICsKICAgIHNjYWxlX3hfZGlzY3JldGUoJ3N1YnNldHMnKQpgYGAKCgojIyMgYmlnZ2VzdCBjaGFuZ2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIERFTlNJVFksIEVER0VTLCBVU0VTX1RPVCkgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICVpbiUgYygKICAgICAgJ29uZScsIAogICAgICAnZm91cicKICAgICAgKQogICAgIyBVU0VTX1RPVCA+PSAxMDAwMAogICAgKSAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTEVNTUEpICU+JQogIGRwbHlyOjptdXRhdGUoREVOU19ESUZGID0gREVOU0lUWSAtIGxhZyhERU5TSVRZLCBkZWZhdWx0PURFTlNJVFlbMV0pKSAlPiUKICBkcm9wX25hKCkgJT4lCiAgc2VsZWN0KC1TVUJTRVQpICU+JQogIHJlbmFtZSgKICAgIERFTlNfTEFTVCA9IERFTlNJVFksCiAgICBFREdFU19MQVNUID0gRURHRVMKICAgICkgJT4lCiAgYXJyYW5nZSgoREVOU19ESUZGKSkKYGBgCgoKIyBGcmVxdWVuY3kgdnMuIG5ldHdvcmtzCgojIyBGcmVxdWVuY3kgdnMuIGNlbnRyYWxpemF0aW9uCgojIyMgUGxvdAoKIyMjIyBGdWxsIHNhbXBsZQoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmb3VyJywKICAgICMgVVNFU19UT1QgJWluJSAoMTUwMDAwOjUwMDAwMCkKICAgICMgTEVNTUEgJWluJSBjKGNhc2VzKQogICAgIyAhTEVNTUEgJWluJSBjKCdzbHV0IHNoYW1pbmcnLCAnZGFzaGNhbScsICdzaGFyZWFibGUnLCAnY3Vja29sZCcsICdkZWVwIGxlYXJuaW5nJywgJ2h5cGVybG9jYWwnKQogICAgKSAlPiUKICBzZWxlY3QoTEVNTUEsIENFTlRfREVHUkVFLCBVU0VTX1RPVCwgVVNFUywgRURHRVMpICU+JQogIGdncGxvdCguLCBhZXMoeD1DRU5UX0RFR1JFRSwgeT1VU0VTX1RPVCkpICsKICAgIGdlb21fdGV4dChhZXMobGFiZWw9TEVNTUEpLCBoanVzdD0tMC4xLCB2anVzdD0tMC4xKSArIAogICAgIyBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKAogICAgICAndXNhZ2UgZnJlcXVlbmN5IChsb2cpJywgCiAgICAgIHRyYW5zPSdsb2cnCiAgICAgICkgKwogICAgc2NhbGVfeF9jb250aW51b3VzKAogICAgICAnZGVncmVlIGNlbnRyYWxpemF0aW9uIChsb2cpJywKICAgICAgdHJhbnM9J2xvZycKICAgICAgKQoKIyBnZ3Bsb3RseShwbHQpCmdnc2F2ZSgnb3V0L2Z1bGxfY2VudF9mcmVxX292ZXJhbGwucGRmJywgd2lkdGg9NiwgaGVpZ2h0PTQpCmBgYAoKCiMjIyMgQ2FzZSBzdHVkaWVzCgpgYGB7cn0KZGZfY2FzZXMgPC0gZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgPT0gJ2Z1bGwnLAogICAgTEVNTUEgJWluJSBjKGNhc2VzKSwKICAgICFMRU1NQSAlaW4lIGMoJ3BvcHB5Z2F0ZScsICd1cHNraWxsJykKICAgICkKCmNhc2VzX2ZyZXFfbWluIDwtIGRmX2Nhc2VzICU+JQogIHNlbGVjdChVU0VTX1RPVCkgJT4lCiAgYXJyYW5nZShVU0VTX1RPVCkgJT4lCiAgc2xpY2UoMToxKSAlPiUKICBwdWxsKFVTRVNfVE9UKQogIAoKY2FzZXNfZnJlcV9tYXggPC0gZGZfY2FzZXMgJT4lCiAgc2VsZWN0KFVTRVNfVE9UKSAlPiUKICBhcnJhbmdlKGRlc2MoVVNFU19UT1QpKSAlPiUKICBzbGljZSgxOjEpICU+JQogIHB1bGwoVVNFU19UT1QpCgpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCA9PSAnZnVsbCcsCiAgICBVU0VTX1RPVCA+PSBjYXNlc19mcmVxX21pbiwKICAgIFVTRVNfVE9UIDw9IGNhc2VzX2ZyZXFfbWF4LAogICAgIUxFTU1BICVpbiUgYygnYmlnIGRpY2sgZW5lcmd5JywgJ3NsdXQgc2hhbWluZycsICdjdWNrb2xkJywgJ3NoYXJlYWJsZScsICdCcmV4aXRlZXInLCAnaW5jZWwnLCAnZGFzaGNhbScpCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgQ0VOVF9ERUdSRUUsIFVTRVNfVE9ULCBVU0VTLCBFREdFUykgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PUNFTlRfREVHUkVFLCB5PVVTRVNfVE9UKSkgKwogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1MRU1NQSksIGNvbG9yPSdibGFjaycsIGhqdXN0PS0wLjEsIHZqdXN0PS0wLjEpICsgCiAgICBnZW9tX3BvaW50KCkgKyAKICAgIGdlb21fdGV4dChkYXRhPWRmX2Nhc2VzLCBhZXMobGFiZWw9TEVNTUEpLCBjb2xvcj0nYmx1ZScsIGhqdXN0PS0wLjEsIHZqdXN0PS0wLjEpICsKICAgICMgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfY29udGludW91cygKICAgICAgJ3VzYWdlIGZyZXF1ZW5jeSAobG9nKScsIAogICAgICB0cmFucz0nbG9nJwogICAgICApICsKICAgIHNjYWxlX3hfY29udGludW91cygKICAgICAgJ2RlZ3JlZSBjZW50cmFsaXphdGlvbicKICAgICAgIyB0cmFucz0nbG9nJwogICAgICApCgojIGdnc2F2ZSgnb3V0L2Nhc2VzX2NlbnRfZnJlcV9vdmVyYWxsLnBkZicsIHdpZHRoPTYsIGhlaWdodD00KQpgYGAKCgojIyMgQmlnZ2VzdCBkaXNjcmVwYW5jaWVzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVRUSU5HID09ICd0aW1lJywKICAgIFNVQlNFVCA9PSAnZm91cicKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTX1RPVCwgQ0VOVF9ERUdSRUUpICU+JQogIG11dGF0ZShESVNDID0gVVNFU19UT1QgLyBDRU5UX0RFR1JFRSkgJT4lCiAgYXJyYW5nZShESVNDKQpgYGAKCgojIyMgQ29ycmVsYXRpb24KCmBgYHtyfQpkZl9jb3JyIDwtIGRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgIyBTVUJTRVQgIT0gJ2Z1bGwnCiAgICAjIEVER0VTID49IDEwMAogICAgKSAlPiUKICBzZWxlY3QoLWMoTEVNTUEsIFNVQlNFVCwgU1RBUlQsIEVORCwgU0tJUCwgU1RBTVApKQogIApjb3IudGVzdChkZl9jb3JyJFVTRVMsIGRmX2NvcnIkQ0VOVF9ERUdSRUUpCmBgYAoKCiMgQ29lZmZpY2llbnQgb2YgdmFyaWF0aW9uCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoCiAgICBTVUJTRVQgPT0gJ2Z1bGwnLAogICAgVVNFU19UT1QgPj0gMTAwMAogICAgKSAlPiUKICBzZWxlY3QoTEVNTUEsIFVTRVNfVE9ULCBDT0VGX1ZBUikgJT4lCiAgYXJyYW5nZShkZXNjKENPRUZfVkFSKSkKYGBgCgoKIyBQcm9jZXNzaW5nIHN0YXR1cwoKIyMgTGVtbWEgbGlzdAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFNUQU1QKSAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmb3VyJykgJT4lCiAgIyBtdXRhdGUoU1RBTVAgPSBhc19kYXRldGltZShTVEFNUCkpICU+JQogIGFycmFuZ2UoZGVzYyhTVEFNUCkpCmBgYAoKCiMjIERhdGFzZXQgc3RhdGlzdGljcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTX1RPVCwgVVNFUlNfVE9UKSAlPiUKICBkcGx5cjo6c3VtbWFyaXNlKAogICAgVVNFU19BTEwgPSBzdW0oVVNFU19UT1QpLAogICAgVVNFUlNfQUxMID0gc3VtKFVTRVJTX1RPVCkKICAgICkKYGBg